package solitaire.presentation;

import java.awt.Dimension;

import javax.swing.JFrame;

import solitaire.controle.CTasDeCartesAlternees;
import solitaire.controle.CUsine;

/**
 * Pr&eacute;sentation du tas de cartes altern&eacute;es.
 *
 * @author Andr&eacute; Simon, J&eacute;r&eacute;my Brault
 */
public class PTasDeCartesAlternees extends PTasDeCartes {

	private static final long serialVersionUID = 2223828307802699454L;
	
	// Controlleur
	private CTasDeCartesAlternees controler;

	// Attributs pour le positionnement
	private int dX, dY;
	private int nbCartes;

	/**
	 * Constructeur cr&eacute;ant un tas de cares color&eacute;es ind&eacute;pendant.
	 */
	public PTasDeCartesAlternees() {
		initPTasDeCartesAlternees();
	}

	/**
	 * Constructeur cr&eacute;ant un tas de cartes altern&eacute;es associ&eacute; &grave; un controlleur.
	 * 
	 * @param controler : {@link CTasDeCartesAlternees} controlleur de tas de cartes altern&eacute;es associ&eacute;
	 */
	public PTasDeCartesAlternees(CTasDeCartesAlternees controler) {
		super(0, 15);
		this.controler = controler;
		initPTasDeCartesAlternees();
	}

	private void initPTasDeCartesAlternees() {	
		setLayout(null);
		nbCartes = 0;
	}

	/**
	 * Change le d&eacute;calage en x des cartes les unes par rapport aux autres.
	 * @param dx : Le nouveau d&eacute;calage horizontal des cartes
	 */
	public void setDX(int dx) {
		dX = dx;
	}

	/**
	 * Change le d&eacute;calage en y des cartes les unes par rapport aux autres.
	 * @param dy : Le nouveau d&eacute;calage vertical des cartes
	 */
	public void setDY(int dy) {
		dY = dy;
	}

	/**
	 * Ajoute une carte au sommet.
	 *
	 * @param carte : {@link PCarte} Un composant de pr&eacute;sentation de carte
	 */
	public void empiler(PCarte carte) {
		add(carte);
		carte.setLocation(nbCartes * dX, nbCartes * dY);
		setComponentZOrder(carte, 0);
		nbCartes++;
		locate();
	}

	/**
	 * Retire une carte du tas de cartes.
	 * 
	 * @param carte : {@link PCarte} Le composant de pr&eacute;sentation de carte &agrave retirer
	 */
	public void depiler(PCarte carte) {
		remove(carte);
		nbCartes--;
		locate();
	}

	/**
	 * @return le nombre de cartes du tas de cartes
	 */
	public int getNbCartes(){
		return nbCartes;
	}

	/**
	 * Demande un re-calcul de la taille du tas de cartes.
	 */
	public void locate() {
		int nbCartesMulLargeur = nbCartes * PCarte.largeur;
		int nbCartesMulHauteur = nbCartes * PCarte.hauteur;
		
		setSize(new Dimension((Math.min(PCarte.largeur, nbCartesMulLargeur)) + ((nbCartes - 1) * dX), (Math.min(PCarte.hauteur, nbCartesMulHauteur)) + ((nbCartes - 1) * dY)));
		setPreferredSize(new Dimension((Math.min(PCarte.largeur, nbCartesMulLargeur)) + (nbCartes * dX), (Math.min(PCarte.hauteur, nbCartesMulHauteur)) + (nbCartes * dY)));
		repaint();
	}

	public static void main(String[] args) {
		JFrame fenetre = new JFrame("Test PTasDeCartesAlternees");

		PCarte c1 = new PCarte("10H");
		PCarte c2 = new PCarte("2D");
		PCarte c3 = new PCarte("KS");
		PCarte c4 = new PCarte("QC");
		c1.setFaceVisible(true);
		c2.setFaceVisible(true);
		c3.setFaceVisible(true);
		c4.setFaceVisible(true);

		CUsine usine = new CUsine();
		PTasDeCartesAlternees alt = new PTasDeCartesAlternees(new CTasDeCartesAlternees("CTasDeCartesAlternees", usine));

		fenetre.getContentPane().add(alt);
		fenetre.setVisible(true);
		fenetre.setBounds(100, 100, 300, 300);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}

}
